#include"udp_server.hpp"
#include<memory>
#include<cstring>
#include<algorithm>

using namespace ns_server;
using namespace std;

static void usage(char proc[])
{
    std::cout << "Usage:\n\t" << proc << " port\n"<< std::endl;
}

//小写转大写
string translation(string request)
{
    transform(request.begin(),request.end(),request.begin(),::toupper);
    return request;
}

//安全检查
static bool isSafe(string&command)
{
    bool flag=true;
    auto pos=command.find("rm");
    if(pos!=string::npos)
        flag=false;

    pos=command.find("mv");
    if(pos!=string::npos)
        flag=false;
    
    pos=command.find("kill");
    if(pos!=string::npos)
        flag=false;
    
    pos=command.find("while");
    if(pos!=string::npos)
        flag=false;
    
    return flag;
}

//模拟bash命令行解释器
string excuteCommand(string request)
{
    //1.安全检查(防止删除/剪切文件)
    if(!isSafe(request))
        return "you are a bad man";


    //2.传递命令
    FILE*fd=popen(request.c_str(),"r");
    if(fd==nullptr) 
        return "error";

    string result;
    char line[2048];
    while(fgets(line,sizeof(line),fd)!=nullptr)
        result+=line;

    return result;
}

int main(int argc,char *argv[])
{
    if(argc!=2)
    {
        usage(argv[0]);
        exit(USAGE_ERR);
    }

    uint16_t port=atoi(argv[1]);
    unique_ptr<UdpServer>usvr(new UdpServer(port,excuteCommand));
    usvr->InitServer();//初始化服务器
    usvr->Start();//启动服务器

    
    return 0;
}